package com.cwnu.sw.cys.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.List;

/**
 * JsonUtils类提供了一系列与JSON处理相关的工具方法
 * 它使用了Jackson库来实现JSON与Java对象之间的相互转换
 * @author jisam
 */
public class JsonUtils {
    /**
     *  创建一个ObjectMapper实例，用于JSON处理
     */
    private static final ObjectMapper JSON_MAPPER = new ObjectMapper();

    /**
     * 将JSON字符串转换为指定类型的Java对象
     * 
     * @param str JSON字符串
     * @param clz 目标Java对象类型
     * @param <T> 泛型标记
     * @return 转换后的Java对象
     * @throws UnsupportedOperationException 如果JSON处理失败
     */
    public static <T> T toObj(String str, Class<T> clz) {
        try {
            return JSON_MAPPER.readValue(str, clz);
        } catch (JsonProcessingException e) {
            throw new UnsupportedOperationException(e);
        }
    }

    /**
     * 将JSON字符串转换为指定类型的Java对象
     * 
     * @param str JSON字符串
     * @param clz 目标Java对象类型引用
     * @param <T> 泛型标记
     * @return 转换后的Java对象
     * @throws UnsupportedOperationException 如果JSON处理失败
     */
    public static <T> T toObj(String str, TypeReference<T> clz) {
        try {
            return JSON_MAPPER.readValue(str, clz);
        } catch (JsonProcessingException e) {
            throw new UnsupportedOperationException(e);
        }
    }

    /**
     * 将JSON字符串转换为指定类型的Java对象列表
     * 
     * @param str JSON字符串
     * @param clz 列表中Java对象的类型
     * @param <T> 泛型标记
     * @return 转换后的Java对象列表
     * @throws UnsupportedOperationException 如果JSON处理失败
     */
    public static <T> List<T> toList(String str, Class<T> clz) {
        try {
            return JSON_MAPPER.readValue(str, new TypeReference<List<T>>() {
            });
        } catch (JsonProcessingException e) {
            throw new UnsupportedOperationException(e);
        }
    }

    /**
     * 将JSON字符串转换为JsonNode对象，便于进一步处理
     * 
     * @param str JSON字符串
     * @return 转换后的JsonNode对象
     * @throws UnsupportedOperationException 如果JSON处理失败
     */
    public static JsonNode toJsonNode(String str) {
        try {
            return JSON_MAPPER.readTree(str);
        } catch (JsonProcessingException e) {
            throw new UnsupportedOperationException(e);
        }
    }

    /**
     * 将JsonNode对象转换为指定类型的Java对象
     * 
     * @param node JsonNode对象
     * @param clz 目标Java对象类型
     * @param <T> 泛型标记
     * @return 转换后的Java对象
     * @throws UnsupportedOperationException 如果JSON处理失败
     */
    public static <T> T nodeToValue(JsonNode node, Class<T> clz) {
        try {
            return JSON_MAPPER.treeToValue(node, clz);
        } catch (JsonProcessingException e) {
            throw new UnsupportedOperationException(e);
        }
    }

    /**
     * 将Java对象转换为JSON字符串
     * 
     * @param t Java对象
     * @return 转换后的JSON字符串
     * @throws UnsupportedOperationException 如果JSON处理失败
     */
    public static String toStr(Object t) {
        try {
            return JSON_MAPPER.writeValueAsString(t);
        } catch (Exception e) {
            throw new UnsupportedOperationException(e);
        }
    }

}
